heroku session-affinityをdisableにし、socket.ioのpollingを切ってwebsocket onlyにした
$ heroku features:disable http-session-affinity
これによってpolling(comet)接続が使えなくなった
理由
なんかHerokuが調子悪そうだった為
元々のインフラ構成
などで説明している
一度session-affinityというcookieが設定されれば、24時間はそのクライアントのリクエストは同じdynoにルーティングされるようになる はずなのだが
しょっちゅうsession-affinityがリセットされ、400 bad requestになってしまう
https://gyazo.com/d8c6563d49573a87bc05f3c05938a140
handshakeしてない知らない人からいきなりメッセージを送りつけられた扱いになる
pollingを完全に捨てて、websocket onlyにすればsession-affinityは必要ない しかし、ほとんど苦情が来なかった
来ても「新しいChromeをインストールしてくれ」で解決した
古いブラウザ使ってる人は居ないと判断した
思い切ってsocket.ioのpollingを切って、古いブラウザのサポートも切り、heroku session-affinityも無効にした
https://gyazo.com/26f781d291d52ab42882bdbf3ef9d177
モダンブラウザ推奨メッセージが出る
実装
code:server.js
const options = {
cookie: false,
serveClient: false,
}
const io = SocketIO(server, options)
code:client.js
const options = {
reconnectionDelay: 5000,
}
const socket = SocketIO(location.origin, options)
結果
エラー無くなってすっきり
https://gyazo.com/05400efa0109369cd9d7ff239da13269
websocket onlyにしたら速くなった
編集が保存されるまでの時間
切断検知や再接続も
体感できるレベルで速い(計測してない)
コードがすっきりした
メモリ使用量も減った
50MBぐらい
webサーバー数も半分になった
ネットワーク経路によってはwebsocketを通さない事があるのではないか?という気がしているが、今のところ問題なさそう
scale直後でも、既存のclientが新しいdynoにすぐルーティングされるようになった sticky-sessionを有効にすると24時間同じdynoにルーティングするので、dynoを増やしてもすぐに効果が出なかった